Skip to content

feat: add CEL-backed rich assigns to state/expr#86

Merged
joshua-temple merged 1 commit into
mainfrom
feat/expr-rich-assigns
May 31, 2026
Merged

feat: add CEL-backed rich assigns to state/expr#86
joshua-temple merged 1 commit into
mainfrom
feat/expr-rich-assigns

Conversation

@joshua-temple
Copy link
Copy Markdown
Collaborator

Adds CEL-backed rich assigns to state/expr, the write-side companion to rich guards. expr.Assign(reg, name, source, schema) compiles a CEL expression that evaluates to a map of context field updates and registers it as an assign reducer the kernel folds inside Fire — referenced from a transition with the Assign verb (or OnEntryAssign/OnExitAssign) exactly like a Go reducer. Compilation and type-checking happen once at authoring time, against the same schema-derived environment guards read; the result type must be a string-keyed map or authoring fails loudly. At run time the reducer evaluates the expression over the prior context, then merges the resulting updates onto a copy via the same JSON projection as the read path (a shallow top-level overlay), staying total and pure: a type-mismatched update or rare runtime eval error leaves the context unchanged. With a Catalog the type-checked AST is collected for tooling/polyglot transport, like guards. Reads the context only (event access is a clean additive follow-up). The expr coverage floor moves 90→88 with a documented rationale: the total-reducer contract introduces unreachable defensive swallow-branches. Additive; stdlib-plus-CEL (no new deps).

Signed-off-by: Joshua Temple <joshua.temple@stablekernel.com>
@joshua-temple joshua-temple merged commit 5a300c7 into main May 31, 2026
10 checks passed
@joshua-temple joshua-temple deleted the feat/expr-rich-assigns branch May 31, 2026 17:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant